package com.zwps.common.core.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
import com.zwps.common.core.exception.UserActionException;
import com.zwps.common.tool.UpdateCheckTool;

import cn.hutool.core.util.ObjectUtil;

public interface CommonService {

    default <T> boolean change(T newVal, T oldVal) {
        return UpdateCheckTool.change(newVal, oldVal);
    }

    default <T, R> void isNotEmptySetEq(LambdaQueryWrapper<T> query, SFunction<T, ?> column, Object val) {
        if (ObjectUtil.isNotEmpty(val)) {
            query.eq(column, val);
        }
    }
    
    default <T, R> void isNotEmptySetLike(LambdaQueryWrapper<T> query, SFunction<T, ?> column, Object val) {
        if (ObjectUtil.isNotEmpty(val)) {
            query.like(column, val);
        }
    }
    
    /**
     * 大于等于
     * @Title: isNotEmptySetGe
     * @Description: 
     * @param <T>
     * @param <R>
     * @param query
     * @param column
     * @param val void
     * @author lyh
     * @date 2023年10月19日 下午5:09:19
     */
    default <T, R> void isNotEmptySetGe(LambdaQueryWrapper<T> query, SFunction<T, ?> column, Object val) {
        if (ObjectUtil.isNotEmpty(val)) {
            query.ge(column, val);
        }
    }
    
    /**
     * 小于等于
     * @Title: isNotEmptySetGe
     * @Description: 
     * @param <T>
     * @param <R>
     * @param query
     * @param column
     * @param val void
     * @author lyh
     * @date 2023年10月19日 下午5:09:56
     */
    default <T, R> void isNotEmptySetLe(LambdaQueryWrapper<T> query, SFunction<T, ?> column, Object val) {
        if (ObjectUtil.isNotEmpty(val)) {
            query.le(column, val);
        }
    }
    
    /**
     * 检测值存在变更就设置更新字段
     * @Title: changedSet
     * @Description: 
     * @param <T>
     * @param <R>
     * @param update
     * @param column
     * @param oldVal
     * @param newVal void
     * @author lyh
     * @date 2023年8月15日 下午7:28:24
     */
    default <T, R> boolean changedSet(LambdaUpdateWrapper<T> update, SFunction<T, ?> column, Object oldVal,
            Object newVal) {
        boolean change;
        update.set(change = change(newVal, oldVal), column, newVal);
        return change;
    }

    /**
     * 检查数据库字段值是否唯一
     * 
     * @Title: checkValueUnique
     * @Description:
     * @param <T>
     * @param <R>
     * @param mapper
     * @param entityClass
     * @param column
     * @param val
     * @param message     void
     * @author lyh
     * @date 2023年5月24日 上午11:45:05
     */
    default <T, R> void checkValueUnique(BaseMapper<T> mapper, Class<T> entityClass, SFunction<T, ?> column, Object val,
            String message) {
        T obj = mapper.selectOne(Wrappers.lambdaQuery(entityClass).eq(column, val).last(" limit 1"));
        if (obj != null) {
            throw new UserActionException(message);
        }
    }
}
